package com.zpark.mq.t2.发布订阅模式;

import com.rabbitmq.client.*;
import com.zpark.mq.t2.utils.RabbitConnectionUtil;

import java.io.IOException;

/**
 * 邮件消费者
 */
public class SMSConsumer {
    // 定义队列名字
    private static final String QUEUE_SMS = "queue_sms";
    // 定义交换机名字
    private static final String  EXCHANGE_FANOUT = "Exchange_fanout_inform";

    public static void main(String[] args) throws Exception {
        // 获取与Broker建立TCP连接
        Connection conn = RabbitConnectionUtil.getConnection("127.0.0.1", "admin",
                "123456", 5672, "test-host");

        // 与Broker开启通道（建立通道）
        Channel channel = conn.createChannel();

        // 声明队列
        channel.queueDeclare(QUEUE_SMS, true, false,
                false, null);

        //声明一个交换机
        //参数：String exchange, String type
        /**
         * 参数明细：
         * 1、交换机的名称
         * 2、交换机的类型
         * fanout：对应的rabbitmq的工作模式是 publish/subscribe
         * direct：对应的Routing	工作模式
         * topic：对应的Topics工作模式
         * headers： 对应的headers工作模式
         */
        channel.exchangeDeclare(EXCHANGE_FANOUT, BuiltinExchangeType.FANOUT);

        //进行交换机和队列绑定
        //参数：String queue, String exchange, String routingKey
        /**
         * 参数明细：
         * 1、queue 队列名称
         * 2、exchange 交换机名称
         * 3、routingKey 路由key，作用是交换机根据路由key的值将消息转发到指定的队列中，在发布订阅模式中调协为空字符串
         */
        channel.queueBind(QUEUE_SMS, EXCHANGE_FANOUT, "");

        // 重写消费方法
        DefaultConsumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String msg = new String(body, "utf-8");
                System.out.println(msg);
            }
        };

        // 监听队列
        channel.basicConsume(QUEUE_SMS, true, consumer);
    }
}
